package com.suxin.spring.task;

import com.suxin.spring.config.DefaultScheduleConfigurer;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author Tang
 * @classname CronTaskManager
 * @description [  ]
 * @date 2021/8/1 21:03
 */
public class CronTaskManager {

    /**
     * 注册器
     */
    private ScheduledTaskRegistrar scheduledTaskRegistrar;

    /**
     * 任务维护表
     */
    private Map<String, ScheduledTask> scheduledTaskMap = new HashMap<>(10);

    /**
     * 原生任务
     */
    private Set<ScheduledTask> scheduledTasks;

    public CronTaskManager(DefaultScheduleConfigurer scheduleConfig) {
        this.scheduledTaskRegistrar = scheduleConfig.getScheduledTaskRegistrar();
        this.scheduledTasks = scheduledTaskRegistrar.getScheduledTasks();
    }

    /**
     * 添加任务
     * @param runnableTask
     * @param expression
     */
    public void addTask(AbstractRunnableTask runnableTask, String expression) {
        // 创建一个定时任务 "*/5 * * * * ?"
        CronTask cronTask = new CronTask(runnableTask, expression);
        scheduledTaskRegistrar.addCronTask(cronTask);
        // 调度任务
        ScheduledTask scheduledTask = scheduledTaskRegistrar.scheduleCronTask(cronTask);
        // 新的任务加入到集合
        scheduledTasks.add(scheduledTask);
        scheduledTaskMap.put(runnableTask.getTaskId(), scheduledTask);
    }

    /**
     * 取消任务
     * @param taskId
     */
    public void cancelTask(String taskId) {
        ScheduledTask scheduledTask = scheduledTaskMap.remove(taskId);
        scheduledTask.cancel();
        scheduledTasks.remove(scheduledTask);
    }

    /**
     * 任务ids,列表
     * @return
     */
    public Set<String> taskIds() {
        return this.scheduledTaskMap.keySet();
    }

}